package com.ruoyi.eservice.service.impl;

import java.util.List;
import java.util.Arrays;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.eservice.pojo.entity.Dict;
import com.ruoyi.eservice.service.IDictService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.ruoyi.common.utils.StringUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.ruoyi.eservice.mapper.CasesMapper;
import com.ruoyi.eservice.pojo.entity.Cases;
import com.ruoyi.eservice.service.ICasesService;

/**
 * 病例详情Service业务层处理
 *
 * @author fancheng BaseService
 * @date 2022-11-10
 */
@Service
public class CasesServiceImpl extends ServiceImpl<CasesMapper,Cases> implements ICasesService
{
    @Autowired
    private CasesMapper casesMapper;

    @Autowired
    private IDictService dictService;

    public <T> QueryWrapper<T> createSelWrapper(Class<T> type) {
        QueryWrapper<T> queryWrapper = Wrappers.query();
        queryWrapper.eq("del_flag", "0");
        return queryWrapper;
    }

    /**
     * 查询病例详情
     *
     * @param casesId 病例详情主键
     * @return 病例详情
     */
    @Override
    public Cases selectCasesByCasesId(Long casesId)
    {
        return casesMapper.selectById(casesId);
    }

    /**
     * 查询病例详情列表
     *
     * @param cases 病例详情
     * @return 病例详情
     */
    @Override
    public List<Cases> selectCasesList(Cases cases)
    {
        QueryWrapper<Cases> queryWrapper = createSelWrapper(Cases.class);
        queryWrapper.lambda()
                .eq(StringUtils.isNotNull(cases.getDictId()), Cases::getDictId, cases.getDictId())
                .eq(StringUtils.isNotNull(cases.getCases()), Cases::getCases, cases.getCases())
                .eq(StringUtils.isNotNull(cases.getCures()), Cases::getCures, cases.getCures())
                .eq(StringUtils.isNotNull(cases.getDeath()), Cases::getDeath, cases.getDeath())
                .eq(StringUtils.isNotNull(cases.getAdded()), Cases::getAdded, cases.getAdded())
                .eq(StringUtils.isNotEmpty(cases.getDelFlag()), Cases::getDelFlag, cases.getDelFlag())
                .eq(StringUtils.isNotNull(cases.getStatus()), Cases::getStatus, cases.getStatus())
        ;
        return casesMapper.selectList(queryWrapper);
    }

    /**
     * 新增病例详情
     *
     * @param cases 病例详情
     * @return 结果
     */
    @Override
    public int insertCases(Cases cases)
    {
        cases.setCreateBy(SecurityUtils.getUsername());
        cases.setCreateTime(DateUtils.getNowDate());
        cases.setUpdateBy(SecurityUtils.getUsername());
        cases.setUpdateTime(DateUtils.getNowDate());
        int rows = casesMapper.insert(cases);
        return rows;
    }

    /**
     * 修改病例详情
     *
     * @param cases 病例详情
     * @return 结果
     */
    @Override
    public int updateCases(Cases cases)
    {
        cases.setUpdateBy(SecurityUtils.getUsername());
        cases.setUpdateTime(DateUtils.getNowDate());

        return casesMapper.updateById(cases);
    }

    /**
     * 批量删除病例详情
     *
     * @param casesIds 需要删除的病例详情主键
     * @return 结果
     */
    @Override
    public int deleteCasesByCasesIds(Long[] casesIds)
    {
        return casesMapper.deleteBatchIds(Arrays.asList(casesIds));
    }

    /**
     * 删除病例详情信息
     *
     * @param casesId 病例详情主键
     * @return 结果
     */
    @Override
    public int deleteCasesByCasesId(Long casesId)
    {
        return casesMapper.deleteById(casesId);
    }

    @Override
    public AjaxResult getDictByName(String areaname) {
        Dict one = null;

        try{
            //根据传来地区的名字查询该地区的具体信息
            one = dictService.lambdaQuery().likeRight(Dict::getName, areaname).one();
        }catch (Exception e){
            //查询到多个项目抛出异常
            return AjaxResult.error("查询到多个符合项目，请精确查询条件！");
        }

        //没有查询到数据
        if(one == null){
            return AjaxResult.error("没有查询到该地点，请精确查询条件！");
        }


        //获取地域id
        Long dictId = one.getDictId();
        //获得当前地域的级别
        Long level = one.getLevel();

        //查询到区级
        if(level == 3){
            Cases one1 = lambdaQuery().eq(Cases::getDictId, dictId).one();
            return AjaxResult.success("获取区级病例信息成功",one1);
        }

        //查询到市级
        if(level == 2){
            //查询市下的所有区
            List<Dict> list = dictService.lambdaQuery().eq(Dict::getParentId, dictId).list();
            Cases cases = new Cases();
            cases.setCases(0L);
            cases.setAdded(0L);
            cases.setDeath(0L);
            cases.setCures(0L);
            cases.setDictId(dictId);

            if(list.isEmpty()){
                return AjaxResult.error("没有查询到该市的信息!");
            }

            list.stream().forEach(li -> {
                //获取区的数据
                Cases one1 = lambdaQuery().eq(Cases::getDictId, li.getDictId()).one();
                cases.setCases(cases.getCases() + one1.getCases());
                cases.setAdded(cases.getAdded() + one1.getAdded());
                cases.setDeath(cases.getDeath() + one1.getDeath());
                cases.setCures(cases.getCures() + one1.getCures());
            });

            return AjaxResult.success("获取市级病例信息成功",cases);

        }

        //查询到省级
        if(level == 1){

//          查询省下面的市列表
            List<Dict> list = dictService.lambdaQuery().eq(Dict::getParentId, dictId).list();
            Cases cases = new Cases();
            cases.setCases(0L);
            cases.setAdded(0L);
            cases.setDeath(0L);
            cases.setCures(0L);
            cases.setDictId(dictId);

            //没有市数据
            if(list.isEmpty()){
                return AjaxResult.error("没有查询到该省的数据！");
            }

            //获取当前市内的区信息
            list.stream().forEach(li ->{
                //获得当前区的列表
                List<Dict> areaList = dictService.lambdaQuery().eq(Dict::getParentId, li.getDictId()).list();

                //该城市所有区域信息
                if(!areaList.isEmpty()){
                    areaList.stream().forEach(al ->{
                        Cases one1 = lambdaQuery().eq(Cases::getDictId, al.getDictId()).one();
                        cases.setCases(cases.getCases() + one1.getCases());
                        cases.setAdded(cases.getAdded() + one1.getAdded());
                        cases.setDeath(cases.getDeath() + one1.getDeath());
                        cases.setCures(cases.getCures() + one1.getCures());
                    });
                }
            });

            return AjaxResult.success("获取省级病例信息成功！",cases);
        }


        return AjaxResult.error("查询失败!没有该地区的记录！");

    }

}
